package org.halk.service.impl;

import lombok.RequiredArgsConstructor;
import org.halk.service.BizService;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;

/**
 * 改造后的代码，把条件封装到了map中，调用方把条件传进来，可以直接使用封装好的函数
 *
 * @Author zhuhao
 * @Date 2022/2/28 15:02
 * @desc
 */
@Service
@RequiredArgsConstructor
public class BizService2Impl implements BizService {

    private final BizUnitService bizUnitService;

    /**
     * 业务逻辑分派Map
     * Function为函数式接口，下面代码中 Function<String, String> 的含义是接收一个Stirng类型的变量，返回一个String类型的结果
     */
    private Map<String, Function<String, String>> checkResultDispatcher = new HashMap<>();

    /**
     * 初始化 业务逻辑分派Map 其中value 存放的是 lambda表达式
     */
    @PostConstruct
    public void checkResultDispatcherInit() {
        checkResultDispatcher.put("1", key -> this.bizUnitService.bizOne(key));
        checkResultDispatcher.put("2", bizUnitService::bizTwo);
        checkResultDispatcher.put("3", bizUnitService::bizThree);
        checkResultDispatcher.put("4", bizUnitService::bizFour);
    }

    @Override
    public String getCheckResultSuper(String key) {
        //从逻辑分派Dispatcher中获得业务逻辑代码，result变量是一段lambda表达式
        Function<String, String> result = checkResultDispatcher.get(key);
        if (result != null) {
            //执行这段表达式获得String类型的结果
            return result.apply(key);
        }
        return "不在处理的逻辑中返回业务错误";
    }
}
